Android 注解有意思
个人对注解的理解是一种说明,对于代码本身的、具有真正限制性的说明。此处只针对于 Android 本身固有的注解及其自定义的使用。
Android 固有注解
Java 注解已经有很多篇优秀文章讲解过了,此处不再赘述,想看的同学戳这里,这篇博客也参考了网上的相关资源,我所做的就是在代码证实际使用验证一下效果。下面简述其分类
1. Null 相关,此类注解 Android 中很常见,不再赘述
- @Nullable:可为 null
- @NonNull:不可为 null
2. Resource Type 相关:用于引用各相关资源时进行编译期检查,因各资源引用时都是整数值,通过该注解检查就能避免不小心引起的错误引用;命名上使用”资源类型名+Res”的方式,如:IntRes、AnimRes 等,具体如下:
- AnimatorRes/AnimRes:Animator/Anim 资源类型
- AnyRes:任意资源类型
- ArrayRes:array 资源类型
- AttrRes:attr 资源类型
- BoolRes/IntegerRes/StringRes:Boolean/Integer/String 资源类型
- Dimen:dimen 资源类型
- ColorRes:color 资源类型,此外:希望通过 RGB 调色时可使用 @ColorInt
- DrawableRes:drawable 资源类型
- FrictionRes:friction 资源类型
- IdRes:id 资源类型
- InterpolatorRes:interpolator 资源类型
- LayoutRes:layout 资源类型
- MenuRes:menu 资源类型
- PluralsRes:plurals 资源类型
- RawRes:raw 资源类型
- StyleableRes/StyleRes:styleable/style 资源类型
- TransitionRes:transition 资源类型
- XmlRes:xml 资源类型
引用错误的资源时 IDE 会给出提示,但不影响构建和部署
###3. Thread 相关:可指定在何种线程中运行(Ps:代码中实际使用了一下并没有什么提示,不知道是什么鬼=_=)
- UIThread:UI 线程
- MainThread:主线程
- WorkerThread:子线程/工作线程
- BinderThread:绑定线程
###4. 枚举相关:可指定默认的枚举类型,非指定类型(即便基本类型一致)入参编译不通过;使用 IntDef 时该种方式对于变量无能为力,只能传入指定参数;若想不检查变量,可使用 IntRange指定参数范围即可
- IntDef:int 枚举
- StringDef:string 枚举
###5. 一定范围限制相关
- Size:限制集合、数组的大小和倍数以及字符串的长度
- IntRange:int 范围
- FloatRange:float 范围
###6. Permission相关:@RequiresPermission
指定方法需要的具体权限:
@RequiresPermission(Manifest.permission.INTERNET)
需要几个权限中的一种:anyOf
@RequiresPermission(anyOf = {Manifest.permission.INTERNET, Manifest.permission.CAMERA})
同时需要多个权限:allOf
@RequiresPermission(allOf = {Manifest.permission.INTERNET, Manifest.permission.CAMERA})
对于 intent 的权限可直接在其相应的常量字符串字段上标注权限需求
@RequiresPermission(android.Manifest.permission.BLUETOOTH) public static final String ACTION_REQUEST_DISCOVERABLE = "android.bluetooth.adapter.action.REQUEST_DISCOVERABLE";
对于 ContentProvider 的权限,需要单独使用 @Read、@Write 来标注读、写的访问权限
@RequiresPermission.Read(@RequiresPermission(READ_HISTORY_BOOKMARKS)) @RequiresPermission.Write(@RequiresPermission(WRITE_HISTORY_BOOKMARKS)) public static final Uri BOOKMARKS_URI = Uri.parse("content://browser/bookmarks");
###7. 重写相关:@CallSuper,强制某一方法在重写时调用其父类方法,如 Activity 的 onCreate();若为使用时未重写父类方法会给出提示
@CallSuper
protected void onCreate(@Nullable Bundle savedInstanceState)
###8. 方法返回值相关:@CheckResult,希望提示调用者使用方法的返回值,调用者未使用时会给出提示
@CheckResult
public Build setPostType(int type){
mIntent.putExtra(FeedPostActivity.TYPE_FEED_POST, type);
return this;
}
自定义注解及其简单应用,此处以 @IntRange 作为示例;自定义注解 @PostType,作用是确定参数的整数范围,可以使用 int 值或对应的 int 常量,检查时只检查 int 值本身
传入范围之外的值时 IDE 会提示,但是不影响运行
使用常量值替代更利于阅读,效果同上
有什么想说的可以联系我,欢迎骚扰